const fs = require('fs').promises;
const path = require('path');


/**
 * 处理detail v0.0.2版本模板类型代码生成
 * @param {Object} data - 前端传来的数据
 * @param {Object} templateConfig - 模板配置参数
 * @param {string} targetDir - 目标目录
 * @param {string} hooksDir - hooks目录
 * @param {Object} res - Express响应对象
 */
async function processDetailLongnows(data, templateConfig, targetDir, hooksDir, res) {
  const { headerFields,detailQueryFields,detailListFields, detailFormFields, vueFileName } = templateConfig;
  const templateDir = path.join(__dirname, '../../codeTemplate/detail');
  
  // 先完整拷贝整个模板目录到目标目录
  await copyDirectory(templateDir, targetDir);
  
  // // 渲染并覆盖特定的文件 - hooks/useForms.ts
  const formsContent = await new Promise((resolve, reject) => {
    res.render('detail/hooks/useForms.ejs', {
      headerFields:headerFields,
      detailListFields:detailListFields,
      detailQueryFields: detailQueryFields,
      detailFormFields: detailFormFields
    }, (err, html) => {
      if (err) {
        console.error('Error rendering useForms.ejs:', err);
        reject(err);
      } else {
        resolve(html);
      }
    });
  });
  
  // // 渲染并覆盖特定的文件 - hooks/useTables.ts
  // const tablesContent = await new Promise((resolve, reject) => {
  //   res.render('detail/hooks/useTables.ejs', {
  //     detailQueryFields: detailQueryFields,
  //     detailFormFields: detailFormFields
  //   }, (err, html) => {
  //     if (err) {
  //       console.error('Error rendering useTables.ejs:', err);
  //       reject(err);
  //     } else {
  //       resolve(html);
  //     }
  //   });
  // });
  
  // // 写入文件（覆盖已拷贝的文件）
  await fs.writeFile(path.join(targetDir, 'hooks', 'useForms.tsx'), formsContent);
  // await fs.writeFile(path.join(targetDir, 'hooks', 'useTables.ts'), tablesContent);
  
  // 处理Vue文件
  const pageCode = data.pageCode || '';
  await processVueFile('detail',  vueFileName, pageCode, targetDir, res);
  
  // 清理拷贝过来的ejs模板文件
  await cleanupEjsFiles(targetDir);
}

/**
 * 清理目录中的ejs文件
 * @param {string} dir - 目标目录路径
 */
async function cleanupEjsFiles(dir) {
  try {
    const entries = await fs.readdir(dir, { withFileTypes: true });

    for (const entry of entries) {
      const fullPath = path.join(dir, entry.name);
      
      if (entry.isDirectory()) {
        // 递归处理子目录
        await cleanupEjsFiles(fullPath);
      } else if (entry.isFile() && path.extname(entry.name) === '.ejs') {
        // 删除.ejs文件
        await fs.unlink(fullPath);
        console.log(`Deleted template file: ${fullPath}`);
      }
    }
  } catch (error) {
    console.error('Error cleaning up ejs files:', error);
  }
}

/**
 * 复制目录的辅助函数
 * @param {string} src - 源目录路径
 * @param {string} dest - 目标目录路径
 */
async function copyDirectory(src, dest) {
  await fs.mkdir(dest, { recursive: true });
  const entries = await fs.readdir(src, { withFileTypes: true });

  for (const entry of entries) {
    const srcPath = path.join(src, entry.name);
    const destPath = path.join(dest, entry.name);

    if (entry.isDirectory()) {
      await copyDirectory(srcPath, destPath);
    } else {
      await fs.copyFile(srcPath, destPath);
    }
  }
}

/**
 * 处理detail模板类型代码生成主函数
 * @param {Object} data - 前端传来的数据
 * @param {Object} templateConfig - 模板配置参数
 * @param {string} targetDir - 目标目录
 * @param {string} hooksDir - hooks目录
 * @param {Object} res - Express响应对象
 */
async function processDetailTemplate(data, templateConfig, targetDir, hooksDir, res) {
  // 根据版本选择处理方法
  const handler = processDetailLongnows;
  if (handler) {
    await handler(data, templateConfig, targetDir, hooksDir, res);
  } else {
    throw new Error(`Unsupported detail`);
  }
}

/**
 * 处理Vue文件
 * @param {string} templateType - 模板类型
 * @param {string} vueFileName - Vue文件名
 * @param {string} pageCode - 页面代码
 * @param {string} targetDir - 目标目录
 * @param {Object} res - Express响应对象
 */
async function processVueFile(templateType, vueFileName, pageCode, targetDir, res) {
  const vueSourcePath = path.join(__dirname, `../../codeTemplate/${templateType}/${vueFileName}`);
  const vueDestPath = path.join(targetDir, vueFileName);
  
  if (pageCode) {
    // 如果传入了pageCode，则使用EJS渲染模板
    try {
      const vueContent = await new Promise((resolve, reject) => {
        res.render(`${templateType}/${vueFileName.replace('.vue', '')}`, {
          pageCode: pageCode
        }, (err, html) => {
          if (err) {
            console.error(`Error rendering ${vueFileName}:`, err);
            reject(err);
          } else {
            resolve(html);
          }
        });
      });
      await fs.writeFile(vueDestPath, vueContent);
    } catch (error) {
      // 如果使用EJS渲染失败，尝试使用旧的方法
      try {
        let vueContent = await fs.readFile(vueSourcePath, 'utf8');
        // 替换标记为实际的pageCode
        vueContent = vueContent.replace(/<!--\s*{{pageCode}}\s*-->/g, pageCode);
        // 同时替换 const pageCode = "<%= pageCode %>" 这样的字符串
        vueContent = vueContent.replace(/const pageCode = ["']<%= pageCode %>["']/g, `const pageCode = '${pageCode}'`);
        await fs.writeFile(vueDestPath, vueContent);
      } catch (error2) {
        console.error(`Error processing ${vueFileName}:`, error2);
        throw error2;
      }
    }
  } else {
    // 如果没有传入pageCode，则直接复制文件
    await fs.copyFile(vueSourcePath, vueDestPath);
  }
}

module.exports = {
  processDetailTemplate
};